Ajax(Asynchronous JavaScript and XML)
✒️ 2025-05-23 14:49 내용 수정
참고 자료 : TCPSchool ajax intro, TCPSchool ajax server response, TCPSchool ajax header response
Javascript를 이용한 백그라운드 비동기 통신
- 웹 페이지 전체를 다시 로딩하지 않아도 웹 페이지 일부분만을 갱신할 수 있도록 해준다.
- 서버와 Ajax간에는 JSON, XML, HTML, 텍스트 파일 등의 데이터를 주고 받을 수 있다.
- HTML, JavaScript, XML 지식을 요구한다.
- Ajax 프레임워크로는 Prototype, script.aculo.us, dojo, jQuery 등을 사용한다.
장단점
-
장점
- 웹 페이지 전체를 다시 로딩하지 않아도 웹 페이지 일부분만을 갱신할 수 있도록 해준다.
- 웹 페이지가 로드된 후에 서버로 데이터를 주고 받을 수 있다.
- 백그라운드 영역에서 서버로 데이터를 보낼 수 있다.
-
단점
- Ajax는 클라이언트가 서버에 데이터를 요청하는 클라이언트 풀링 방식을 사용하기 때문에 서버 푸시 방식의 실시간 서비스는 만들 수 없다.
- 클라이언트 풀링 : 사용자가 직접 원하는 정보를 서버에게 요청하여 얻는 방식
- 서버 푸시 : 사용자가 요청하지 않아도 서버가 알아서 자동으로 특정 정보를 제공하는 방식
- 바이너리 데이터를 보내거나 받을 수 없다.
- Ajax 스크립트가 포함되지 않은 서버로 Ajax 요청을 보낼 수 없다.
- 클라이언트의 PC로 Ajax 요청을 보낼 수 없다.
- Ajax는 클라이언트가 서버에 데이터를 요청하는 클라이언트 풀링 방식을 사용하기 때문에 서버 푸시 방식의 실시간 서비스는 만들 수 없다.
동작 원리
| 구성 요소 | 역할 |
|---|---|
| HTML, CSS | 웹 페이지의 표현 HTML, CSS(Cascading Style Sheet) |
| DOM 모델 | 데이터를 접근하거나 화면 구성을 동적으로 조작 문서 객체 모델(Document Object Model) |
| JSON, XML | 데이터 교환 JSON(JavaScript Object Notation) |
| XMLHttpRequest 객체 | 웹 서버와의 비동기식 통신 |
| JavaScript | 모든 기술들을 결합하여 사용자의 작업 흐름을 제어 JavaScript |


XMLHttpRequest 객체
- Ajax의 가장 핵심적인 구성 요소로, 웹 브라우저가 서버와 데이터를 교환할 때 사용하는 객체다.
- 객체 생성은 인터넷 익스플로러(IE)에선 ActiveXObject 객체를 사용하여 생성하고, 그외의 브라우저에서는 XMLHttpRequest 객체를 사용한다.
- 다만 현재는 IE를 자주 사용하지 않기에 참고.
var xhr = null;
function createRequest() {
if (xhr != null) {
return;
}
if (window.ActiveXObject) {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
} else {
xhr = new XMLHttpRequest();
}
}
서버 요청 메소드
- HTTP(Hyper Text Transfer Protocol)#HTTP 요청 메서드 참고.
- 서버에 요청을 보내기 위해선 먼저 XMLHttpRequest 인스턴스를 생성하고, 인스턴스의
open()메소드와send()메소드로 요청을 보낸다.
| 메소드 | 설명 |
|---|---|
open(전달방식, URL주소, 비동기화여부) |
서버로 보낼 Ajax 요청의 형식 설정 |
| 전달 방식 : "GET", "POST" | |
| 비동기화 여부는 true면 비동기화, false면 동기화 | |
send() |
Ajax 요청을 서버로 전달(전달 방식이 GET일 때) |
send("문자열") |
Ajax 요청을 서버로 전달(전달 방식이 POST일 때) |
-
GET : 주소에 데이터를 추가하여 전달
- 브라우저에 HTTP 요청이 캐시되어 저장됨
- query string에 데이터를 포함시켜 전송하기 때문에 길이 제한이 있음
- query string 참고.
- 보안상 취약점이 존재하여 주의해야 한다.
-
POST : 데이터를 별도로 첨부하여 전달
- 브라우저에 HTTP 요청이 캐시되지 않으며, 브라우저 히스토리에도 남지 않음
- query string와 별도로 HTTP 요청 데이터를 전송하므로 길이 제한이 없음
- GET보다 보안성이 높음
- POST로 전송 시 request에 MIME type을 설정해야 하므로 html의 form의 기본 Context-Type인
application/x-www-form-urlencoded형태(key=value&key=value)를 지정해야 함setRequestHeader("Content-Type", "application/x-www-form-urlencoded")설정 필요- Content-Type 헤더의 기본 값은 "
text/html"로 설정되어 있어 사용하려는 파일 형태에 따라 변경할 필요가 있다. - 참고 자료 :
// 전송 메소드는 커스텀하여 만들 수 있음
// custom 가능
// url : 목적지
// param : 파라미터
// callback : 처리 후 돌아올 위치
// method : 전송방식(GET, POST)
function sendRequest(url, param, callback, method) {
// HttpRequest 생성
createRequest();
// 전송 타입 구분
// method 전달 시 대소문자을 섞어 쓰지 않도록 주의
var httpMethod = (method != 'POST' && method != 'post') ? 'GET' : 'POST';
// 파라미터 구분
// 비어있는지 확인
var httpParam = (param == null || param == '') ? null : param;
// 접근 url
var httpURL = url;
// 요청 방식이 GET이고 전달할 파라미터가 있다면 새 url 경로 제작
// query string에 param을 넣어 전달
if (httpMethod == 'GET' && httpParam != null) {
httpURL = httpURL+'?'+httParam;
}
// 서버로 보낼 Ajax 요청 형식
xhr.open(httpMethod, httpURL, true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
// 작업이 완료된 후 호출할 callback 메소드 지정
xhr.onreadystatechange=callback;
// Ajax 요청을 서버로 전달
// GET이면 send(), POST면 send("문자열")
xhr.send(httpMethod == 'POST' ? httpParam : null);
}
서버 응답 확인
- Ajax에서 서버로부터의 응답을 확인할 때 XMLHttpRequest 객체의 property를 사용한다.
readyState: XMLHttpRequest 객체의 현재 상태를 나타냄
| 상태 | 설명 |
|---|---|
| UNSENT (0) | XMLHttpRequest 객체가 생성됨 |
| OPENED (1) | opne() 메소드가 성공적으로 실행됨 |
| HEADERS_RECEIVED (2) | 모든 요청에 대한 응답 도착 |
| LOADING (3) | 요청한 데이터 처리중 |
| DONE (4) | 요청한 데이터의 처리가 완료되어 응답할 준비가 됨 |
status: 서버의 문서 상태를 나타냄
| 상태 | 설명 |
|---|---|
| 200 | 서버에 문서가 존재함 |
| 404 | 서버에 문서가 존재하지 않음 |
- onreadystatechange : XMLHttpRequest 객체의 readyState property의 값이 변할 때마다 자동으로 호출될 함수를 설정
- 원하는 함수를 작성하여
XMLHttpRequest.onreadystatechange = 함수로 설정 가능 - 서버에서 응답이 도착할 때까지 readyState property의 값에 따라 여러 번 호출될 수 있다.
- 원하는 함수를 작성하여
- onload : 로드가 완료되면 자동으로 호출할 함수를 설정
// xhr = new XMLHttpRequest()
function resultFn() {
if (xhr.readyState == 4 && xhr.status == 200) { // Done, 서버에 문서가 존재함
// 도착한 데이터를 읽어오기
var data = xhr.responseText;
}
}